package modelo;

import java.util.List;

import entidad.CalificacionDetalle;
import entidad.Curso;
import entidad.Empleado;
import gui.curso.PanelCurso;
import gui.estudiante.PanelEstudiantesPorCurso;
import interfaz.IEntidad;

import javax.swing.table.AbstractTableModel;

import manejador.ManejadorDeCalificacionDetalle;
import manejador.ManejadorDeCurso;
import manejador.ManejadorDeEmpleado;

public class ModeloCalificacionDetalle extends AbstractTableModel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private ManejadorDeCalificacionDetalle manejadorDeCalificacionDetalle = null;
	private List<IEntidad> calificacionesDetalle = null;
	private static ModeloCalificacionDetalle instancia = null;
	private String[] encabezados = null;
	private static String parametro = "TODOS";
	private CalificacionDetalle calificacionDetalle = null;
	private ModeloCalificacion modeloCalificacion = null;

	public static ModeloCalificacionDetalle getInstancia() {
		if (instancia == null) {
			instancia = new ModeloCalificacionDetalle();
		}
		return instancia;
	}

	private ModeloCalificacionDetalle() {
		modeloCalificacion = ModeloCalificacion.getInstancia();
		manejadorDeCalificacionDetalle = ManejadorDeCalificacionDetalle
				.getInstancia();
		encabezados = new String[] { "ID Calificacion Detalle", "Descripcion",
				"Nota Acumulativa", "Curso", "Profesor", "Fecha", "Estatus" };
		calificacionesDetalle = manejadorDeCalificacionDetalle
				.getEntidadDinamica(getParametro(), PanelEstudiantesPorCurso
						.getIdEstudiante(), PanelCurso.getIdCurso());
	}

	public String getColumnName(int indice) {
		return encabezados[indice];

	}

	@Override
	public int getColumnCount() {
		return encabezados.length;

	}

	@Override
	public int getRowCount() {

		return calificacionesDetalle.size();
	}

	@Override
	public Object getValueAt(int fila, int columna) {
		String retorno = "";
		calificacionDetalle = (CalificacionDetalle) calificacionesDetalle
				.get(fila);
		Curso curso = (Curso) ManejadorDeCurso.getInstancia().getEntidadPorId(
				PanelCurso.getIdCurso());
		Empleado empleado = (Empleado) ManejadorDeEmpleado.getInstancia()
				.getEntidadPorId(curso.getIdEmpleado());

		switch (columna) {
		case 0:
			retorno = String.valueOf(calificacionDetalle
					.getIdCalificacionDetalle());
			break;
		case 1:
			retorno = calificacionDetalle.getDescripcion();
			break;
		case 2:
			retorno = String.valueOf(calificacionDetalle.getNotaAcumulada());
			break;
		case 3:
			retorno = curso.getNombre();
			break;
		case 4:
			retorno = empleado.getNombre() + " " + empleado.getApellido();
			break;

		case 5:
			retorno = String.valueOf(calificacionDetalle.getFecha());
			break;
		case 6:
			retorno = calificacionDetalle.getEstatus();
			break;

		}

		return retorno;
	}

	public void agregar(IEntidad calificacion) {
		manejadorDeCalificacionDetalle.agregar(calificacion);
		calificacionesDetalle = manejadorDeCalificacionDetalle
				.getEntidadDinamica(getParametro(), PanelEstudiantesPorCurso
						.getIdEstudiante(), PanelCurso.getIdCurso());
		fireTableDataChanged();

	}

	public void modificarCalificacion(CalificacionDetalle calificacion,
			int idCalificacion) {
		manejadorDeCalificacionDetalle.modificar(calificacion, idCalificacion);
		calificacionesDetalle = manejadorDeCalificacionDetalle
				.getEntidadDinamica(getParametro(), PanelEstudiantesPorCurso
						.getIdEstudiante(), PanelCurso.getIdCurso());
		fireTableDataChanged();
	}

	public void actualizarTableParametros(String parametro) {
		setParametro(parametro);
		calificacionesDetalle = manejadorDeCalificacionDetalle
				.getEntidadDinamica(getParametro(), PanelEstudiantesPorCurso
						.getIdEstudiante(), PanelCurso.getIdCurso());
		fireTableDataChanged();
	}

	public void agregarCursoEstudianteCalificacion(int idEstudiante, int idCurso) {

		int idCalificacion = modeloCalificacion
				.getUltimoRegistroDeTablaCalificacion();
		manejadorDeCalificacionDetalle.agregarCursoEstudianteCalificacion(
				idEstudiante, idCalificacion, idCurso);

	}

	public int getNotaCursoActivo(int idEstudiante, int idCurso) {
		int notaAcumulada = manejadorDeCalificacionDetalle.getNotaCursoActivo(
				idEstudiante, idCurso);
		return notaAcumulada;
	}

	public int getNotaCursoCompleto(int idEstudiante, int idCurso) {
		return manejadorDeCalificacionDetalle.getNotaCursoCompleto(
				idEstudiante, idCurso);
	}

	public static String getParametro() {
		return parametro;
	}

	public void cambiarEstatusCalificacionAActivo(int idEstudiante, int idCurso) {
		manejadorDeCalificacionDetalle.cambiarEstatusCalificacionAActivo(
				idEstudiante, idCurso);
	}

	public void cambiarEstatusCalificacionACompleto(int idEstudiante,
			int idCurso) {
		manejadorDeCalificacionDetalle.cambiarEstatusCalificacionACompleto(
				idEstudiante, idCurso);
		fireTableDataChanged();
	}

	/*
	 * public void acutalizarPromedio(int idEstudiante, int idCurso) {
	 * manejadorDeCalificacionDetalle .acutalizarPromedio(idEstudiante,
	 * idCurso); actualizarTableParametros(getParametro());
	 * 
	 * }
	 */

	public int verificarCalificacion(int idEstudiante, int idCurso) {
		return manejadorDeCalificacionDetalle.verificarCalificacion(
				idEstudiante, idCurso);
	}

	public static void setParametro(String parametro) {
		ModeloCalificacionDetalle.parametro = parametro;
	}

}
